package com.sprouting.ops.task;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import com.sprouting.ops.utils.CheckTool;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

/**
 * 自动数据库创建
 * 这里的初始化比 实现 ApplicationRunner 接口的还快，不能放在 ApplicationRunner 中，会导致初始化就发现数据库不存在
 *
 * @author ：LX（长沙麓谷）
 * @date 创建时间： 2023/3/16 13:16
 */
@Component
@Slf4j
public class AutoDatabaseCreate {

    /**
     * 是否开启数据库自动创建功能
     */
    @Value("${ops.customize.db.create.enabled:true}")
    private Boolean dbCreate;
    /**
     * 数据库连接地址
     */
    @Value("${spring.datasource.url}")
    private String databaseUrl;


    /**
     * 初始化创建数据库,只支持sqlite
     */
    @PostConstruct
    public void createDataBase(){
        if (!dbCreate){
            return;
        }
        log.info("[启动初始化-数据库] 开启数据库自动创建");

        if (CheckTool.checkNull(databaseUrl)){
            log.warn("[启动初始化-数据库] 数据库路径为空，无法自动创建");
            return;
        }
        String lowerCaseUrl = databaseUrl.toLowerCase();

        String path = "";
        if (lowerCaseUrl.contains("sqlite")){
            // sqlite
            path = databaseUrl.substring(databaseUrl.indexOf("sqlite:")).replace("sqlite:", "");

        } else if (lowerCaseUrl.contains("h2")){
            // h2，需要在h2那里直接写死文件名，不要自动安装，h2会自动帮你生成数据库，但要上级目录存在，所以，要想当前类生成，暂时只支持指定数据库名称
            path = databaseUrl.substring(databaseUrl.indexOf("h2:file:")).replace("h2:file:", "");
            path = path + ".mv.db";

        } else {
            log.warn("[启动初始化-数据库] 当前使用数据库无法识别，暂时只支持sqlite或h2数据库");
            return;
        }

        // --- 开始自动创建文件
        if (StrUtil.isEmpty(path)){
            return;
        }

        log.info("[启动初始化-数据库] 数据库路径：{}", path);
        if (FileUtil.exist(path)){
            log.info("[启动初始化-数据库] 数据库已存在,不需要进行创建");
            return;
        }

        FileUtil.touch(path);
        log.info("[启动初始化-数据库] 数据库创建成功");
    }
}
